package com.topgay.controller;

import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import com.topgay.domain.CSCenter;
import com.topgay.domain.Declaration;
import com.topgay.domain.Member;
import com.topgay.domain.ValueStrings;
import com.topgay.service.CSCenterService;
import com.topgay.util.BoardUtilities;
import com.topgay.util.PagingBean;

@Controller
@RequestMapping("/cscenter/")
public class CSCenterController {

	@Autowired
	private CSCenterService cscenterService;
	

	//CS Center - 공지사항/FAQ/Q&A/신고하기
	@RequestMapping("/list.do")
	public String getList(@RequestParam(defaultValue="1")String page, @RequestParam(defaultValue="5")String divide, ModelMap model, HttpSession session) throws Exception{
		
		System.out.println("[/list.do]");
		
		int pageNo = 1;
		int nDivide = 1;
		try {
			pageNo = Integer.parseInt(page);
		}catch(Exception e){
			pageNo = 1;
		}
		
		try {
			nDivide = Integer.parseInt(divide);
		}catch(Exception e){
			nDivide = 1;
		}
		
		model = BoardUtilities.getCSCenterTitle(model, nDivide);
		
		List<CSCenter> list = cscenterService.getCSCenterList(pageNo, nDivide);
		model.addAttribute("cscenterList", list);
		
//		2. PagingBean객체를 생성 ( 필요 정보 : 전체 게시물의 개수, 보고자 하는 페이지 번호)
//		2-1 : DAO의 메소드를 이용해 전체 게시물 수 조회
		int totalContent = cscenterService.getTotalContent(nDivide);
		
//		2-2 : PagingBean 객체 생성
		PagingBean pagingBean = new PagingBean(totalContent, pageNo);
		model.addAttribute("pagingBean", pagingBean);
		
//		2-3 : divide 저장
		model.addAttribute("page", pageNo);
		model.addAttribute("divide", nDivide);
		
		String url = null;
		if(8==nDivide){
			url = "cscenter/cscenter_declaration_list";
		}else{
			url = "cscenter/cscenter_list";
		}
		
		//TODO - cscenterService.getCSCenterList에서 댓글 수 삽입 처리
		
		return url;
		
	}
	

	/**
	 * 공지사항 - 글쓰기 양식
	 * @return
	 */
	@RequestMapping("/login/writeForm.do")
	public String writeForm(String divide, String page, ModelMap model){
		String url = null;
		int nDivide = 1;
		try {
			nDivide = Integer.parseInt(divide);
		}catch(Exception e){
			nDivide = 1;
		}
		model.addAttribute("divide", nDivide);
		model.addAttribute("page", page);
		
		model = BoardUtilities.getCSCenterTitle(model, nDivide);
		
		url = "cscenter/cscenter_write_form";
		
		return url;
	}
	
	/**
	 * 공지사항 - 글쓰기 처리 & 처리후 View 리턴
	 * @return
	 */
	@RequestMapping("/login/writeContent.do")
//	public ModelAndView writeContent(CSCenter cscenter, int divide, @RequestParam(required=false) String email, HttpSession session){
	public String writeContent(CSCenter cscenter, @RequestParam(required=false) String email, String page, ModelMap model, HttpSession session){
		
		//TODO - int divide 값 parse 확인
		String url = null;
		
		int pageNo = 1;
		try {
			pageNo = Integer.parseInt(page);
		}catch(Exception e){
			pageNo = 1;
		}
		
		Member member = (Member)session.getAttribute("login_info");
		cscenter.setId(member.getId());
		cscenter.setNickname(member.getNickname());
		
		if(email!=null){
			cscenter.setEmail(email);
		}else{
			cscenter.setEmail(member.getEmail());
		}
		cscenter.setDivide(cscenter.getDivide());
		
		System.out.println("[writeContent]cscenter="+cscenter.toString());
//		2. Business Logic - Model(Business Service)로 요청
		cscenterService.setWriteContent(cscenter);
		
		model.addAttribute("page", pageNo);
		
		model = BoardUtilities.getCSCenterTitle(model, cscenter.getDivide());
		
//		return new ModelAndView("redirect:/cscenter/getContent.do?no="+cscenter.getCscenterNo()+"&divide="+divide);
//		return new ModelAndView("redirect:/cscenter/getContent.do?no="+cscenter.getCscenterNo());
		
		return "redirect:/cscenter/getContent.do?no="+cscenter.getCscenterNo();
	}
	
	/**
	 * 한개의 글(게시물)을 조회하는 handler 메소드
	 * 
	 * @param no - 조회하고자 하는 글번호
	 * @param page - 조회하고자 하는 페이지 번호
	 * @param model - 조회한 글 데이터를 저장할 ModelMap
	 * @return
	 */
	@RequestMapping("/getContent.do")
//	public String getContent(String no, @RequestParam(defaultValue="1")String page, String divide, ModelMap model){
	public String getContent(String no, @RequestParam(defaultValue="1")String page, ModelMap model){
		String url = null;
		int cscenterNo = 1;
//		int nDivide = 1;
		try {
			cscenterNo = Integer.parseInt(no);
		}catch(Exception e){
			cscenterNo = 1;
		}
//		try {
//			nDivide = Integer.parseInt(divide);
//		}catch(Exception e){
//			nDivide = 1;
//		}
		
		CSCenter cscenter = null;
		try {
			//2. Business Logic 요청 - Model
			cscenter = cscenterService.getCSCenterContentByNo(cscenterNo);
			
			model.addAttribute("cscenter", cscenter);
			model.addAttribute("page", page);
//			model.addAttribute("divide", divide);
			
//			model = BoardUtilities.getCSCenterTitle(model, nDivide);
			model = BoardUtilities.getCSCenterTitle(model, cscenter.getDivide());
			
			url = "cscenter/cscenter_show_content";
		}catch(Exception e){
			e.printStackTrace();
			model.addAttribute("error_msg", "글 조회도중 오류 발생 : "+e.getMessage());
			url = "redirect:/error.jsp";
		}
		return url;
	}
	
	/**
	 * 한개의 글(게시물)을 조회하는 handler 메소드 : getContent.do
	 * 
	 * getContent.do 에서 
	 * 수정 폼에서 취소 키 눌렀을 때 조회값 증가 X
	 * 
	 * @param no - 조회하고자 하는 글번호
	 * @param page - 조회하고자 하는 페이지 번호
	 * @param model - 조회한 글 데이터를 저장할 ModelMap
	 * @return
	 */
	@RequestMapping("/login/getContentBack.do")
	public String getContentBack(String no, @RequestParam(defaultValue="1")String page, ModelMap model){
//	public String getContentBack(String no, @RequestParam(defaultValue="1")String page, String divide, ModelMap model){
		String url = null;
		int cscenterNo = 1;
		try {
			cscenterNo = Integer.parseInt(no);
		}catch(Exception e){
			cscenterNo = 1;
		}
//		int nDivide = 1;
//		try {
//			nDivide = Integer.parseInt(divide);
//		}catch(Exception e){
//			nDivide = 1;
//		}
		
		CSCenter cscenter = null;
		try {
			//2. Business Logic 요청 - Model
			cscenter = cscenterService.getCSCenterContentByNoNotViewCount(cscenterNo);
			
			model.addAttribute("cscenter", cscenter);
			model.addAttribute("page", page);
//			model.addAttribute("divide", divide);
			
//			model = BoardUtilities.getCSCenterTitle(model, nDivide);
			model = BoardUtilities.getCSCenterTitle(model, cscenter.getDivide());
			
			url = "cscenter/cscenter_show_content";
		}catch(Exception e){
			e.printStackTrace();
			model.addAttribute("error_msg", "글 조회도중 오류 발생 : "+e.getMessage());
			url = "redirect:/error.jsp";
		}
		return url;
	}
	
	
	/**
	 * 수정폼 으로 이동을 처리하는 handler 메소드
	 * @param no - 수정할 글 번호. 이 번호의 글을 조회해서 응답처리한다.
	 * @param model - 수정할 글 데이터를 View에 전송하기 위한 ModelMap
	 * @return
	 */
	@RequestMapping("/login/modifyForm.do")
	public String modifyForm(String no, String page, ModelMap model){
		String url = null;
		
		int cscenterNo = 1;
		try {
			cscenterNo = Integer.parseInt(no);
		}catch(Exception e){
			cscenterNo = 1;
		}
		
		try {
			CSCenter cscenter = cscenterService.getContentByNoForForm(cscenterNo);
			model.addAttribute("cscenter", cscenter);
			model.addAttribute("page", page);
			
			model = BoardUtilities.getCSCenterTitle(model, cscenter.getDivide());
			
			url = "cscenter/cscenter_modify_form";
			
		}catch(Exception e){
			e.printStackTrace();
			model.addAttribute("error_msg", "글 조회도중 오류 발생 : "+e.getMessage());
			url = "redirect:/error.jsp";
		}
		return url;
	}
	
	/**
	 * 수정폼에서 수정한 글을 처리하기 위한 Handler 메소드
	 * 
	 * @param cscenter
	 * @param page
	 * @return
	 */
	@RequestMapping("/login/modifyContent.do")
	public ModelAndView modifyContent(CSCenter cscenter, String page){
		System.out.println("[modifyContent.do]page="+page);
		ModelAndView mv = null;
		try {
			cscenterService.modifyContent(cscenter);
			mv = new ModelAndView("redirect:/cscenter/getContent.do?no="+cscenter.getCscenterNo()+"&page="+page);
		}catch(Exception e){
			e.printStackTrace();
			mv = new ModelAndView("redirect:/error.jsp", "error_msg", "수정 처리중 오류 발생" + e.getMessage());
		}
		return mv;
	}
	
	/**
	 * 글 삭제 처리 handler 메소드
	 * @param cscenterNo
	 * @param page
	 * @param map
	 * @return
	 */
	@RequestMapping("/login/deleteContent.do")
//	public String deleteContent(String no, String page, String divide, ModelMap map){
	public String deleteContent(String no, String page, String divide, ModelMap map){
		String url = null;
		int cscenterNo = 1;
		try {
			cscenterNo = Integer.parseInt(no);
		}catch(Exception e){
			cscenterNo = 1;
		}
		int nDivide = 1;
		try {
			nDivide = Integer.parseInt(divide);
		}catch(Exception e){
			nDivide = 1;
		}
		try {
			CSCenter cscenter = cscenterService.getCSCenterContentByNoNotViewCount(cscenterNo);
			cscenterService.deleteContentByNo(cscenterNo);
			//TODO : 해당 cscenterNo에 일치되는 답변 글 모두 삭제 처리 
		
//			map.addAttribute("page", page);
//			map.addAttribute("divide", nDivide);
			
//			url = "redirect:/cscenter/list.do?page="+page+"&divide="+divide;
			url = "redirect:/cscenter/list.do?page="+page+"&divide="+cscenter.getDivide();
//			url = "redirect:/cscenter/list.do";
			
		} catch(Exception e){
			e.printStackTrace();
			map.addAttribute("error_msg", "글 조회도중 오류 발생 : "+e.getMessage());
			url = "redirect:/error.jsp";
		}
		return url;
	}
	
	
	/**
	 * 신고하기 - 글쓰기 처리 & 처리후 View 리턴
	 * @return
	 */
	@RequestMapping("/login/writeDeclarationContent.do")
	public String writeDeclarationContent(String assaulterId, String contentForReply, HttpSession session){
		
		Member member = (Member)session.getAttribute("login_info");
		
		Declaration declaration = new Declaration();
		declaration.setId(member.getId());
		declaration.setNickname(member.getNickname());
		declaration.setContent(contentForReply);
		declaration.setAssaulterId(assaulterId);
		
		System.out.println("[writeDeclarationContent]declaration="+declaration.toString());
		
		cscenterService.setWriteDeclarationContent(declaration);
		
		return "a";
	}
	
}